﻿#pragma once
/**
@author 何炜
@date 2011/4/27
@brief 兼容std::string的字符串.
@details
*/


namespace GLL
{
	class String;

	///StringStream定义 使用的很频繁，简单一些
	typedef std::stringstream StringStream;
	typedef StringStream SS;

	/**字符串函数.
	@param 
	@return UTF-8字符串的 [内存字节]长度(包括 \0) 
	@remarks 一个中文长度为3
	*/
	int FindBM(const char* str_in, int , const char*, int);

	/**int64 转 字符串.
	@param n 需要转成字符串的数字
	@param rad 转换后用何种进制来表示
	@return 转换后的字符串
	@remarks 返回值必须用 utf8_ptr, GString, GStream 去接，其他方法会造成数据丢失。
	*/
	String Int2Str(__int64 n, int rad=10);

	extern int arg_str_len_out;

	/**本地CodePage转Utf8.
	@param str 待转换的字符串
	@param str_len 待转换字符串的长度。-1表示以"\0"为结束。
	@param UTF8_len_o 转换后的utf8字符串长度（含"\0"）。
	@return 转换后的字符串。
	@remarks 返回值必须用 utf8_ptr, GString, GStream 去接，其他方法会造成数据丢失。
	*/
	String Str2Utf8(const String& str, int& UTF8_len_o = arg_str_len_out); 

	/**Utf8转本地CodePage转.
	@see Str2Utf8
	*/
	String Utf82Str(const String& str, int& CP_len_o = arg_str_len_out);


	/**字符串类.*/
	class String : public std::string
	{
	public:
		/**析构.
		@remark std::string的析构不是虚的。需要主动调用。感谢[杨再河]的指正
		*/
		~String(){std::string::~basic_string();}
		String(void){}
		String(const std::string& str):std::string((const std::string& )str){}
		String(const String& std_str):std::string(std_str){}
		String(const utf8* utf8_str):std::string(utf8_str ? (const char*)utf8_str : ""){}
		String(const char* code_page):std::string(code_page ? code_page : ""){}
		String(const StringStream& strm):std::string(strm.str()){}

		operator const utf8*() const{return c_str_utf8();}
		operator const char*() const{return c_str();}

		String& operator=(const utf8* utf8_str)
		{
			const char* ptr = (const char*)utf8_str; //Utf82Str(utf8_str);
			std::string::operator = (ptr);
			return *this;
		}
		String& operator=(const char* pstr)
		{
			std::string::operator = (pstr);
			return *this;
		}
		String& operator +=(const String& right)
		{
			std::string::operator +=(right.c_str());
			return *this;
		}

		const utf8* c_str_utf8() const{return (const utf8*)c_str();}
		
		/**所包含的文字字符数量.
		@remarks 和size()不同，size()是	所占内存的字节数。
		*/
		uint char_num() const;

		/**替换.
		*/
		void replace(const String& from, const String& to);

		/**BM字符串查找法.
		@return 所找到字串的开始位置，-1为未找到
		*/
		int find_bm(const String& str) const{return FindBM(c_str(), size(), str.c_str(), str.size());}

		typedef std::vector<String> Vector;

		/**拆分.
		*/
		Vector split(const String& delims = "\t\n ", unsigned int maxSplits = 0) const;
	};

	typedef String::Vector StringVec;

};//GLL


